home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / dns / query.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  8KB  |  337 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import generators
  5. import errno
  6. import select
  7. import socket
  8. import struct
  9. import sys
  10. import time
  11. import dns.exception as dns
  12. import dns.inet as dns
  13. import dns.name as dns
  14. import dns.message as dns
  15. import dns.rdataclass as dns
  16. import dns.rdatatype as dns
  17.  
  18. class UnexpectedSource(dns.exception.DNSException):
  19.     pass
  20.  
  21.  
  22. class BadResponse(dns.exception.FormError):
  23.     pass
  24.  
  25.  
  26. def _compute_expiration(timeout):
  27.     if timeout is None:
  28.         return None
  29.     else:
  30.         return time.time() + timeout
  31.  
  32.  
  33. def _wait_for(ir, iw, ix, expiration):
  34.     done = False
  35.     check_count = 0
  36.     while not done:
  37.         check_count += 1
  38.         if check_count > 5000:
  39.             print >>sys.stderr, 'DNS LOOP? dns.query._wait_for has run %d times' % check_count
  40.         
  41.         if expiration is None:
  42.             timeout = None
  43.         else:
  44.             timeout = expiration - time.time()
  45.             if timeout <= 0:
  46.                 raise dns.exception.Timeout
  47.             
  48.         
  49.         try:
  50.             if timeout is None:
  51.                 (r, w, x) = select.select(ir, iw, ix)
  52.             else:
  53.                 (r, w, x) = select.select(ir, iw, ix, timeout)
  54.         except select.error:
  55.             e = None
  56.             if e.args[0] != errno.EINTR:
  57.                 raise e
  58.             
  59.         except:
  60.             e.args[0] != errno.EINTR
  61.  
  62.         done = True
  63.         if len(r) == 0 and len(w) == 0 and len(x) == 0:
  64.             raise dns.exception.Timeout
  65.             continue
  66.  
  67.  
  68. def _wait_for_readable(s, expiration):
  69.     _wait_for([
  70.         s], [], [
  71.         s], expiration)
  72.  
  73.  
  74. def _wait_for_writable(s, expiration):
  75.     _wait_for([], [
  76.         s], [
  77.         s], expiration)
  78.  
  79.  
  80. def udp(q, where, timeout = None, port = 53, af = None, source = None, source_port = 0, ignore_unexpected = False):
  81.     wire = q.to_wire()
  82.     if af is None:
  83.         
  84.         try:
  85.             af = dns.inet.af_for_address(where)
  86.         af = dns.inet.AF_INET
  87.  
  88.     
  89.     if af == dns.inet.AF_INET:
  90.         destination = (where, port)
  91.         if source is not None:
  92.             source = (source, source_port)
  93.         
  94.     elif af == dns.inet.AF_INET6:
  95.         destination = (where, port, 0, 0)
  96.         if source is not None:
  97.             source = (source, source_port, 0, 0)
  98.         
  99.     
  100.     s = socket.socket(af, socket.SOCK_DGRAM, 0)
  101.     
  102.     try:
  103.         expiration = _compute_expiration(timeout)
  104.         s.setblocking(0)
  105.         if source is not None:
  106.             s.bind(source)
  107.         
  108.         _wait_for_writable(s, expiration)
  109.         s.sendto(wire, destination)
  110.         check_count = 0
  111.         while None:
  112.             check_count += 1
  113.             if check_count > 5000:
  114.                 print >>sys.stderr, 'DNS LOOP? dns.query.udp loop has run %d times' % check_count
  115.             
  116.             (wire, from_address) = s.recvfrom(65535)
  117.             if (from_address == destination or dns.inet.is_multicast(where)) and from_address[1] == destination[1]:
  118.                 break
  119.             
  120.             if not ignore_unexpected:
  121.                 raise UnexpectedSource, 'got a response from %s instead of %s' % (from_address, destination)
  122.                 continue
  123.         s.close()
  124.         r = dns.message.from_wire(wire, keyring = q.keyring, request_mac = q.mac)
  125.         if not q.is_response(r):
  126.             raise BadResponse
  127.         
  128.         return r
  129.  
  130.  
  131.  
  132. def _net_read(sock, count, expiration):
  133.     s = ''
  134.     check_count = 0
  135.     while count > 0:
  136.         check_count += 1
  137.         if check_count > 5000:
  138.             print >>sys.stderr, 'DNS LOOP? dns.query._net_read loop has run %d times' % check_count
  139.         
  140.         _wait_for_readable(sock, expiration)
  141.         n = sock.recv(count)
  142.         if n == '':
  143.             raise EOFError
  144.         
  145.         count = count - len(n)
  146.         s = s + n
  147.     return s
  148.  
  149.  
  150. def _net_write(sock, data, expiration):
  151.     current = 0
  152.     l = len(data)
  153.     check_count = 0
  154.     while current < l:
  155.         check_count += 1
  156.         if check_count > 5000:
  157.             print >>sys.stderr, 'DNS LOOP? dns.query._net_write loop has run %d times' % check_count
  158.         
  159.         _wait_for_writable(sock, expiration)
  160.         current += sock.send(data[current:])
  161.  
  162.  
  163. def _connect(s, address):
  164.     
  165.     try:
  166.         s.connect(address)
  167.     except socket.error:
  168.         (ty, v) = sys.exc_info()[:2]
  169.         if v[0] != errno.EINPROGRESS and v[0] != errno.EWOULDBLOCK and v[0] != errno.EALREADY:
  170.             raise ty, v
  171.         
  172.     except:
  173.         v[0] != errno.EALREADY
  174.  
  175.  
  176.  
  177. def tcp(q, where, timeout = None, port = 53, af = None, source = None, source_port = 0):
  178.     wire = q.to_wire()
  179.     if af is None:
  180.         
  181.         try:
  182.             af = dns.inet.af_for_address(where)
  183.         af = dns.inet.AF_INET
  184.  
  185.     
  186.     if af == dns.inet.AF_INET:
  187.         destination = (where, port)
  188.         if source is not None:
  189.             source = (source, source_port)
  190.         
  191.     elif af == dns.inet.AF_INET6:
  192.         destination = (where, port, 0, 0)
  193.         if source is not None:
  194.             source = (source, source_port, 0, 0)
  195.         
  196.     
  197.     s = socket.socket(af, socket.SOCK_STREAM, 0)
  198.     
  199.     try:
  200.         expiration = _compute_expiration(timeout)
  201.         s.setblocking(0)
  202.         if source is not None:
  203.             s.bind(source)
  204.         
  205.         _connect(s, destination)
  206.         l = len(wire)
  207.         tcpmsg = struct.pack('!H', l) + wire
  208.         _net_write(s, tcpmsg, expiration)
  209.         ldata = _net_read(s, 2, expiration)
  210.         (l,) = struct.unpack('!H', ldata)
  211.         wire = _net_read(s, l, expiration)
  212.     finally:
  213.         s.close()
  214.  
  215.     r = dns.message.from_wire(wire, keyring = q.keyring, request_mac = q.mac)
  216.     if not q.is_response(r):
  217.         raise BadResponse
  218.     
  219.     return r
  220.  
  221.  
  222. def xfr(where, zone, rdtype = dns.rdatatype.AXFR, rdclass = dns.rdataclass.IN, timeout = None, port = 53, keyring = None, keyname = None, relativize = True, af = None, lifetime = None, source = None, source_port = 0, serial = 0):
  223.     if isinstance(zone, (str, unicode)):
  224.         zone = dns.name.from_text(zone)
  225.     
  226.     q = dns.message.make_query(zone, rdtype, rdclass)
  227.     if rdtype == dns.rdatatype.IXFR:
  228.         rrset = dns.rrset.from_text(zone, 0, 'IN', 'SOA', '. . %u 0 0 0 0' % serial)
  229.         q.authority.append(rrset)
  230.     
  231.     if keyring is not None:
  232.         q.use_tsig(keyring, keyname)
  233.     
  234.     wire = q.to_wire()
  235.     if af is None:
  236.         
  237.         try:
  238.             af = dns.inet.af_for_address(where)
  239.         af = dns.inet.AF_INET
  240.  
  241.     
  242.     if af == dns.inet.AF_INET:
  243.         destination = (where, port)
  244.         if source is not None:
  245.             source = (source, source_port)
  246.         
  247.     elif af == dns.inet.AF_INET6:
  248.         destination = (where, port, 0, 0)
  249.         if source is not None:
  250.             source = (source, source_port, 0, 0)
  251.         
  252.     
  253.     s = socket.socket(af, socket.SOCK_STREAM, 0)
  254.     if source is not None:
  255.         s.bind(source)
  256.     
  257.     expiration = _compute_expiration(lifetime)
  258.     _connect(s, destination)
  259.     l = len(wire)
  260.     tcpmsg = struct.pack('!H', l) + wire
  261.     _net_write(s, tcpmsg, expiration)
  262.     done = False
  263.     soa_rrset = None
  264.     soa_count = 0
  265.     if relativize:
  266.         origin = zone
  267.         oname = dns.name.empty
  268.     else:
  269.         origin = None
  270.         oname = zone
  271.     tsig_ctx = None
  272.     first = True
  273.     check_count = 0
  274.     while not done:
  275.         check_count += 1
  276.         if check_count > 5000:
  277.             print >>sys.stderr, 'DNS LOOP? dns.query.xfr loop has run %d times' % check_count
  278.         
  279.         mexpiration = _compute_expiration(timeout)
  280.         if mexpiration is None or mexpiration > expiration:
  281.             mexpiration = expiration
  282.         
  283.         ldata = _net_read(s, 2, mexpiration)
  284.         (l,) = struct.unpack('!H', ldata)
  285.         wire = _net_read(s, l, mexpiration)
  286.         r = dns.message.from_wire(wire, keyring = q.keyring, request_mac = q.mac, xfr = True, origin = origin, tsig_ctx = tsig_ctx, multi = True, first = first)
  287.         tsig_ctx = r.tsig_ctx
  288.         first = False
  289.         answer_index = 0
  290.         delete_mode = False
  291.         expecting_SOA = False
  292.         if soa_rrset is None:
  293.             if not (r.answer) or r.answer[0].name != oname:
  294.                 raise dns.exception.FormError
  295.             
  296.             rrset = r.answer[0]
  297.             if rrset.rdtype != dns.rdatatype.SOA:
  298.                 raise dns.exception.FormError, 'first RRset is not an SOA'
  299.             
  300.             answer_index = 1
  301.             soa_rrset = rrset.copy()
  302.             if rdtype == dns.rdatatype.IXFR:
  303.                 if soa_rrset[0].serial == serial:
  304.                     done = True
  305.                 else:
  306.                     expecting_SOA = True
  307.             
  308.         
  309.         for rrset in r.answer[answer_index:]:
  310.             if done:
  311.                 raise dns.exception.FormError, 'answers after final SOA'
  312.             
  313.             if rrset.rdtype == dns.rdatatype.SOA and rrset.name == oname:
  314.                 if expecting_SOA:
  315.                     if rrset[0].serial != serial:
  316.                         raise dns.exception.FormError, 'IXFR base serial mismatch'
  317.                     
  318.                     expecting_SOA = False
  319.                 elif rdtype == dns.rdatatype.IXFR:
  320.                     delete_mode = not delete_mode
  321.                 
  322.                 if rrset == soa_rrset and not delete_mode:
  323.                     done = True
  324.                 
  325.             not delete_mode
  326.             if expecting_SOA:
  327.                 rdtype = dns.rdatatype.AXFR
  328.                 expecting_SOA = False
  329.                 continue
  330.         
  331.         if done and q.keyring and not (r.had_tsig):
  332.             raise dns.exception.FormError, 'missing TSIG'
  333.         
  334.         yield r
  335.     s.close()
  336.  
  337.